package com.cm.behavior.templatemethod;

/**
 * <a href="https://blog.csdn.net/luckykapok918/article/details/49334417">模板方法</a>
 * 模板方法模式被用来定义一个算法的骨架，其中一些步骤由基类实现，而其他步骤由子类实现.
 * 抽象模板类（AbstractClass）定义了模板方法（templateMethod），该方法按照一定的顺序调用了一系列的步骤
 * @author cm.g
 * @date 2023/9/7 19:35
 */
public abstract class BasePhone {
    /**
     * 模板方法：开机
     */
    public final void turnOn() {
        initSystem();
        showLogo();

        if (isPlayMusic()) {
            playMusic();
        }

        lockAndSleep();
    }

    /**
     * 初始系统
     */
    protected abstract void initSystem();

    /**
     * 显示开机logo
     */
    protected abstract void showLogo();

    /**
     * 播放开机音乐
     */
    protected abstract void playMusic();

    /**
     * 锁屏并待机
     */
    protected abstract void lockAndSleep();

    /**
     * 是否播放开机音乐  :钩子函数
     *
     * @return 钩子
     */
    protected boolean isPlayMusic() {
        return true;
    }
}
